import sys,os
import ctypes
import psutil
import subprocess
import requests




def Custom_Message(parent_hwnd: int = 0, title: str = 'default_title', text: str = 'default_text', type: int = 0) -> int:
    """
    显示自定义消息框。

    该函数通过 ctypes 调用 Windows API 来显示一个带有自定义内容和标题的消息框。
    可以用于快速在 Windows 应用程序中创建消息提示。

    Args:
        parent_hwnd (int): 父窗口的窗口句柄。默认值为 0，表示没有父窗口。
        title (str): 消息框的标题。默认值为 'default_title'。
        text (str): 消息框的内容。默认值为 'default_text'。
        type (int): 消息框的类型，决定了消息框的样式和按钮。默认值为 0。

    Returns:
        int: 用户点击消息框按钮后返回的值，表示用户的选择。
    """
    return ctypes.windll.user32.MessageBoxW(parent_hwnd, text, title, type)

def Checkout_Has_Msedge_Process(_process_name:str="msedge.exe"):
    """检查是否存在指定名称的进程
        
        Args:
            _process_name (str): 进程名称
        
        Returns:
            bool: 如果存在指定名称的进程，则返回 True，否则返回 False
        
        Example:
            >>> CheckMsEdgeProcess('msedge.exe')
            True
        """
    _is_process_running = False
    for _proc in psutil.process_iter(['name']):
        if _proc.info['name'] == _process_name:
            _is_process_running = True
            break
    return _is_process_running


def Checkout_Debug_Mode_Activate() -> bool:
    """
    检查调试模式路径是否可用

    Returns:
        bool: 如果调试模式路径可用，则返回 True，否则返回 False

    Example:
        >>> MyEdge.CheckOutDebugModePath()
        True
    """
    url = "http://127.0.0.1:9652/json/version"
    try:
        response = requests.get(url=url)
        if response.status_code == 200:
            result = True
        else:
            result = False
    except Exception as e:
        print(f"请求调试模式路径时发生错误: {e}")
        result = False
    return result


def Close_All_Msedge_Process(_process_name: str="msedge.exe") -> bool:
    """
    关闭所有指定名称的进程

    Args:
        _process_name (str): 进程名称

    Returns:
        bool: 如果成功关闭所有指定名称的进程，则返回 True，否则返回 False

    Example:
        >>> MyEdge.CloseAllMsEdgeProcess('msedge.exe')
        True
    """
    success = True  # 初始化返回值
    for proc in psutil.process_iter(['pid', 'name']):
        if _process_name == proc.info['name']:
            try:
                proc.kill()  # 关闭进程
                print(f"Closed Microsoft Edge process with PID: {proc.info['pid']}")
            except Exception as e:
                print(f"Failed to close Microsoft Edge process with PID: {proc.info['pid']}. Error: {e}")
                success = False  # 如果关闭失败，设置返回值为 False
    return success

def Start_Debugmode_Browser():
    # 定义启动命令
    command = r'"C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" --remote-debugging-port=9652 --disable-extensions "http://127.0.0.1:9652/json/version" "https://fxg.jinritemai.com/ffa/mshop/homepage/index" "https://myseller.taobao.com/home.htm/QnworkbenchHome/"'
    
    # 启动新的进程
    # subprocess.Popen(command, shell=True)
    CREATE_NEW_CONSOLE = 0x00000010
    subprocess.Popen(command, shell=True, creationflags=CREATE_NEW_CONSOLE)

def Start_Debugmode_Browser_With_Extensions():
    # 定义启动命令
    command = r'"C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" --remote-debugging-port=9652 "http://127.0.0.1:9652/json/version" "https://fxg.jinritemai.com/ffa/mshop/homepage/index" "https://myseller.taobao.com/home.htm/QnworkbenchHome/"'
    
    # 启动新的进程
    # subprocess.Popen(command, shell=True)
    CREATE_NEW_CONSOLE = 0x00000010
    subprocess.Popen(command, shell=True, creationflags=CREATE_NEW_CONSOLE)






if __name__ == "__main__":
    #  判断是否需要强制开启,不需要等待.
    if sys.argv.__len__() > 1:
        if sys.argv[1] == "--force":
            Close_All_Msedge_Process()
            Start_Debugmode_Browser()
            exit(0)
        elif sys.argv[1] == "--extensions":
            Close_All_Msedge_Process()
            Start_Debugmode_Browser_With_Extensions()
    
    # 1.获取当前是否存在浏览器进程
    
    CheckResul_Process = Checkout_Has_Msedge_Process()
    if(CheckResul_Process == False):
        Start_Debugmode_Browser()
        exit(0)
    
    # 2.判断是否是调试模式
    CheckResul_DebugModu = Checkout_Debug_Mode_Activate()
    if(CheckResul_DebugModu == False):
        _select_execute = Custom_Message(text="是否要全部关闭,重新打开!",type=1)
        
        # 判断选择那种方式启动浏览器
        match _select_execute:
            case 1:
                Close_All_Msedge_Process()
                Start_Debugmode_Browser()
            case 2:
                exit(0)
    else:
        _select_execute = Custom_Message(text="当前环境正是调试模式下的浏览器!\n因此不用重新创建\n\n\n如果需要全部关闭重新启动的话,请选择!\n选择是的话,会关闭当前所有的浏览器进程,以最纯净的环境启动.",type=1)
        
        if _select_execute == 1:
            Close_All_Msedge_Process()
            Start_Debugmode_Browser()
    
    